﻿using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

namespace Teal.Compiler {

    #region MemberDefinition

    /// <summary>
    /// 表示一个成员（如方法、字段、类型、包等）定义。
    /// </summary>
    public abstract partial class MemberDefinition {

        /// <summary>
        /// 将当前成员的文档注释添加到指定的文档生成器。
        /// </summary>
        /// <param name="writer">输出文档的构建器。</param>
        public virtual void generateDoc(IndentedTextWriter writer) {

            if (docComment == null) {
                if (!modifiers.hasFlag(Modifiers.@private)) {
                    Compiler.warning(ErrorCode.none, String.Format("缺少公开成员“{0}”的文档注释", reference.signature), name);
                }
                return;
            }

            writer.WriteLine("{");
            writer.Indent++;
            writeDocKeyValue(writer, "memberType", memberType.getName());
            writeDocKeyValue(writer, "signature", reference.signature);
            writeDocKeyValue(writer, "name", reference.name);
            writeDocKeyValue(writer, "modifiers", reference.modifiers.getNames());
            
            //writer.WriteLine("\"annotations\": [");
            //writer.Indent++;
            
            //writer.Indent--;
            //writer.WriteLine("]");

         //   writeDocKeyValue(writer, "location",)
            
            for (var tag = docComment.tags; tag != null; tag = tag.next) {
                switch (tag.name) {
                    case "summary":
                      //  writer.write(tag.name, tag.value);
                        break;
                    case "params":
                        break;
                }
            }

            writer.Indent--;
            writer.WriteLine("}");
        }

        /// <summary>
        /// 向输出器写入键和值。
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        protected void writeDocKeyValue(IndentedTextWriter writer, string key, string value) {
            writeDocString(writer, key);
            writer.Write(": ");
            writeDocString(writer, value);
            writer.WriteLine(", ");
        }

        /// <summary>
        /// 向输出器写入键和值。
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="value"></param>
        /// <param name="value"></param>
        protected void writeDocString(IndentedTextWriter writer, string value) {
            writer.Write(Utility.escapeString(value));
        }

    }

    #endregion

    #region TypeDefinitions

    /// <summary>
    /// 表示一个可以包含子成员的容器成员定义。
    /// </summary>
    public abstract partial class MemberContainerDefinition {

        /// <summary>
        /// 将当前成员的文档注释添加到指定的文档生成器。
        /// </summary>
        /// <param name="writer">输出文档的构建器。</param>
        [DebuggerStepThrough]
        public override void generateDoc(IndentedTextWriter writer) {
            for (var member = members; member != null; member = member.next) {
                member.generateDoc(writer);
                if (member.next != null) {
                    writer.Write(", ");
                }
                writer.WriteLine();
            }
        }

    }

    /// <summary>
    /// 表示一个类型（如类、结构、接口）定义。
    /// </summary>
    public abstract partial class TypeDefinition {}

    /// <summary>
    /// 表示一个类定义。
    /// </summary>
    public partial class ClassDefinition {

    }

    /// <summary>
    /// 表示一个结构定义。
    /// </summary>
    public partial class StructDefinition {

    }

    /// <summary>
    /// 表示一个接口定义。
    /// </summary>
    public partial class InterfaceDefinition {

    }

    /// <summary>
    /// 表示一个枚举定义。
    /// </summary>
    public partial class EnumDefinition {

    }

    /// <summary>
    /// 表示一个扩展定义。
    /// </summary>
    public partial class ExtensionDefinition {

    }

    #endregion

    #region NamespaceDefinitions

    /// <summary>
    /// 表示一个命名空间定义。
    /// </summary>
    public partial class NamespaceDefinition {

    }

    /// <summary>
    /// 表示一个源编译单元。
    /// </summary>
    public partial class SourceUnit {

    }

    /// <summary>
    /// 表示一个模块。
    /// </summary>
    public partial class ModuleDefinition {

        /// <summary>
        /// 将当前成员的文档注释添加到指定的文档生成器。
        /// </summary>
        /// <param name="writer">输出文档的构建器。</param>
        public sealed override void generateDoc(IndentedTextWriter writer) {
            writer.WriteLine("{");
            writer.Indent++;
            writeDocKeyValue(writer, "path", Compiler.options.outputPath);
            writeDocKeyValue(writer, "time", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"));
            writer.WriteLine("\"members\": [");
            writer.Indent++;
            base.generateDoc(writer);
            writer.Indent--;
            writer.WriteLine("]");
            writer.Indent--;
            writer.Write("}");
        }

    }

    #endregion

    #region TypeMemberDefinitions

    /// <summary>
    /// 表示一个类型子成员定义。
    /// </summary>
    public abstract partial class TypeMemberDefinition {}

    /// <summary>
    /// 表示一个方法或属性定义。
    /// </summary>
    public abstract partial class MethodOrPropertyDefinition {}

    /// <summary>
    /// 表示一个字段定义。
    /// </summary>
    public partial class FieldDefinition {

        //
        //   Represents header string for documentation comment.
        //
    }

    /// <summary>
    /// 表示一个属性定义。
    /// </summary>
    public partial class PropertyDefinition {

    }

    /// <summary>
    /// 表示一个索引器定义。
    /// </summary>
    public partial class IndexerDefinition {

    }

    /// <summary>
    /// 表示一个方法定义。
    /// </summary>
    public partial class MethodDefinition {

        //
        //   Represents header string for documentation comment.
        //
    }

    /// <summary>
    /// 表示一个构造函数定义。
    /// </summary>
    public partial class ConstructorDefinition {

    }

    /// <summary>
    /// 表示一个构造函数定义。
    /// </summary>
    public partial class DeconstructorDefinition {

    }

    /// <summary>
    /// 表示操作符重载定义。
    /// </summary>
    public partial class OperatorDefinition {

    }

    /// <summary>
    /// 表示一个枚举的成员定义。
    /// </summary>
    public partial class EnumMemberDefinition {

    }

    #endregion

}
